<?php

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 * Description of axis
 *
 * @author huyan
 */
class Axis {
	
	private $axis = array();
	
	/**
	 * 坐标轴
	 * 
	 * @param string        $type         坐标轴类型，默认为类目型'category'
	 * @param string        $position     坐标轴类型，默认为'bottom'
	 * @param array         $data         数值和时间型，共包括三项属性：
	 *                                         min，指定的最小值，eg: 0，默认无，会自动根据具体数值调整，指定后将忽略boundaryGap[0]
	 *                                         max，指定的最大值，eg: 100，默认无，会自动根据具体数值调整，指定后将忽略boundaryGap[1]
	 *                                         scale，bool型 脱离0值比例，放大聚焦到最终_min，_max区间 默认false
	 *                                         splitNumber，number型 分割段数，不指定时根据min、max算法调整
	 *                                     类目类型，通常为数组类型：
	 *                                         类目型坐标轴文本标签数组，指定label内容。 数组项通常为文本，'\n'指定换行，如:
	 *                                         ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', ..., 'Dec']
	 * @param array         $name         坐标轴名称，包括三项，适用于数值型，时间型
	 *                                     name，坐标轴名称，默认为空
	 *                                     nameLocation，坐标轴名称位置，默认为'end'，可选为：'start' | 'end'
	 *                                     nameTextStyle，坐标轴名称文字样式，默认取全局配置，颜色跟随axisLine主色，可设
	 * @param bool|array    $boundaryGap  类目型, 类型为bool，类目起始和结束两端空白策略，默认为true留空，false则顶头
	 *                                     数值型，时间型，类型为数组，[0, 0]，坐标轴两端空白策略，数组内数值代表百分比，[原始数据最小值与最终最小值之间的差额，原始数据最大值与最终最大值之间的差额]
	 * @param array         $log          适用于log类型轴，共两项：
	 *                                     logLabelBase number axis.type === 'log'时生效。指定时，axisLabel显示为指数形式，如指定为4时，axisLabel可显示为4²、4³。不指定时，显示为普通形式，如 1,000,000
	 *                                     logPositive number axis.type === 'log'时生效。指明是否使用反向log数轴（从而支持value为负值）。默认自适应，即如果value全为负值，则logPositive自动设为false，否则为true。
	 * @param bool          $show         显示策略，可选为：true（显示） | false（隐藏）
	 */
	public function __construct($type, $position, $data = array(), $name = array(), $boundaryGap = array(), $log = array(), $show = true){
		$this->axis['type'] = $type;
		$this->axis['position'] = $position;
		if($data){
			$this->axis['data'] = $data;
		}
		if($name){
			$this->axis['name'] = $name;
		}
		if($boundaryGap){
			$this->axis['boundaryGap'] = $boundaryGap;
		}
		if($log){
			$this->axis['log'] = $log;
		}
		$this->axis['show'] = $show;
	}
	
	/**
	 * 坐标轴线，默认显示且带如下样式：
	 * 
	 * @param bool         $show          是否显示，默认为true，设为false后下面都没意义了
	 * @param bool         $onZero        定位到垂直方向的0值坐标上
	 * @param array        $lineStyle     属性lineStyle控制线条样式,默认：
	 *                                     {
     *                                       color: '#48b',
     *                                       width: 2,
     *                                       type: 'solid'
     *                                     } 
	 * @return $this
	 */
	public function axisLine($show = true, $onZero = true, $lineStyle = array()){
		$axisLineArr = array();
		$axisLineArr['show'] = $show;
		$axisLineArr['onZero'] = $onZero;
		if($lineStyle){
			$axisLineArr['lineStyle'] = $lineStyle;
		}
		$this->axis['axisLine'] = $axisLineArr;
		return $this;
	}
	
	/**
	 * 坐标轴小标记，数值轴和时间轴默认不显示，类目轴默认显示
	 * 
	 * @param bool         $show          是否显示，默认为true，设为false后下面都没意义了
	 * @param str|num|func $interval      适用于类目型，默认值'auto', 小标记显示挑选间隔，默认为'auto'，可选为： 
     *                                     'auto'（随axisLabel，自动隐藏显示不下的） | 0（全部显示） | 
     *                                     {number}（用户指定选择间隔） 
     *                                     {function}函数回调，传递参数[index，data[index]]，返回true显示，返回false隐藏
	 * @param bool         $onGap         适用于类目型，小标记是否显示为间隔，默认等于boundaryGap
	 * @param bool         $inside        小标记是否显示为在grid内部，默认在外部
	 * @param number       $length        属性length控制线长，默认5
	 * @param array        $lineStyle     属性lineStyle控制线条样式,默认：
	 *                                     {
     *                                       color: '#333',
     *                                       width: 1
     *                                     } 
	 * @return $this
	 */
	public function axisTick($show = true, $interval = 'auto', $onGap = '', $inside = false, $length = '5', $lineStyle = array()){
		$axisTickArr = array();
		$axisTickArr['show'] = $show;
		$axisTickArr['interval'] = $interval;
		if($onGap){
			$axisTickArr['onGap'] = $onGap;
		}
		$axisTickArr['inside'] = $inside;
		$axisTickArr['length'] = $length;
		if(!$lineStyle){
			$axisTickArr['lineStyle'] = $lineStyle;
		}
		$this->axis['axisTick'] = $axisTickArr;
		return $this;
	}
	
	/**
	 * 坐标轴文本标签选项
	 * 
	 * @param bool         $show          是否显示，默认为true，设为false后下面都没意义了
	 * @param str|num|func $interval      适用于类目型，标签显示挑选间隔，默认为'auto'，可选为： 
     *                                     'auto'（自动隐藏显示不下的） | 0（全部显示） | 
     *                                     {number}（用户指定选择间隔） 
     *                                     {function}函数回调，传递参数[index，data[index]]，返回true显示，返回false隐藏
	 * @param number       $rotate        标签旋转角度，默认为0，不旋转，正值为逆时针，负值为顺时针，可选为：-90 ~ 90
	 * @param number       $margin        坐标轴文本标签与坐标轴的间距，默认为8，单位px
	 * @param bool         $clickable     坐标轴文本标签是否可点击 默认false
	 * @param str|func     $formatter     间隔名称格式器：{string}（Template） | {Function}
	 * @param array        $lineStyle     文本样式
	 *                                     {
     *                                       color: '#333',
     *                                     } 
	 * @return $this
	 */
	public function axisLabel($show = true, $interval = 'auto', $rotate = 0, $margin = 8, $clickable = false, $formatter = '', $lineStyle = array()){
		$axisLabelArr = array();
		$axisLabelArr['show'] = $show;
		$axisLabelArr['interval'] = $interval;
		$axisLabelArr['rotate'] = $rotate;
		$axisLabelArr['margin'] = $margin;
		$axisLabelArr['clickable'] = $clickable;
		if($formatter){
			$axisLabelArr['formatter'] = $formatter;
		}
		if($lineStyle){
			$axisLabelArr['lineStyle'] = $lineStyle;
		}
		$this->axis['axisLabel'] = $axisLabelArr;
		return $this;
	}
	
	/**
	 * 分隔线，默认显示且带如下样式
	 * 
	 * @param bool         $show          是否显示，默认为true，设为false后下面都没意义了
	 * @param bool         $onGap         适用于类目型，分隔线是否显示为间隔，默认等于boundaryGap
	 * @param array        $lineStyle     属性lineStyle控制线条样式
	 *                                     {
     *                                       color: '#333',
	 *                                       width: 1,
	 *                                       type: 'solid'
     *                                     } 
	 * @return $this
	 */
	public function splitLine($show = true, $onGap = '', $lineStyle = array()){
		$splitLineArr = array();
		$splitLineArr['show'] = $show;
		if($onGap){
			$splitLineArr['onGap'] = $onGap;
		}
		if($lineStyle){
			$splitLineArr['lineStyle'] = $lineStyle;
		}
		$this->axis['splitLine'] = $splitLineArr;
		return $this;
	}
	
	/**
	 * 分隔区域，默认不显示
	 * 
	 * @param bool         $show          是否显示，默认为true，设为false后下面都没意义了
	 * @param bool         $onGap         适用于类目型，分隔线是否显示为间隔，默认等于boundaryGap
	 * @param array        $areaStyle     属性areaStyle
	 *                                     {
     *                                       color: [
	 *                                         'rgba(250,250,250,0.3)',
	 *                                         'rgba(200,200,200,0.3)'
	 *                                       } 
     *                                     } 
	 * @return $this
	 */
	public function splitArea($show = true, $onGap = '', $areaStyle = array()){
		$splitAreaArr = array();
		$splitAreaArr['show'] = $show;
		if($onGap){
			$splitAreaArr['onGap'] = $onGap;
		}
		if($areaStyle){
			$splitAreaArr['areaStyle'] = $areaStyle;
		}
		$this->axis['splitArea'] = $splitAreaArr;
		return $this;
	}
	
	/**
	 * 获取配置数据
	 * 
	 * @return array
	 */
	public function get(){
		return $this->axis;
	}
}
